home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAEDelete.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.7 KB  |  159 lines  |  [TEXT/CWIE]

  1. // SVAEDelete.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEDelete.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11. #include "SVAESelect.h"
  12.  
  13.  
  14. #pragma segment AppleEvent
  15.  
  16.  
  17.  
  18. // -----------------------------------------------------------------------
  19. //        Name:         DoDelete
  20. //        Purpose:    Performs a delete text operation on the direct object,
  21. //                    if there is no direct object then delete the current
  22. //                    selection
  23. // -----------------------------------------------------------------------
  24.      
  25. pascal OSErr    DoDelete(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  26. {
  27. #pragma unused (reply, refcon)
  28.  
  29.     AEDesc        directObj = {typeNull, NULL};
  30.     TextToken    aTextToken;
  31.     short        ignore;
  32.     OSErr        err;
  33.  
  34.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  35.     if (noErr != err) goto done;
  36.     
  37.     if (directObj.descriptorType != typeNull)
  38.         err = DeleteDesc(&directObj);
  39.     else
  40.     {            // Just delete the selection of the front window
  41.         err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);
  42.         if (noErr != err) goto done;
  43.         
  44.         err = DeleteTextToken(&aTextToken);
  45.     }
  46.  
  47. done:    
  48.     if (directObj.dataHandle)
  49.         AEDisposeDesc(&directObj);
  50.         
  51.     return(err);
  52. } // DoDeleteEdit
  53.  
  54.  
  55. OSErr    DeleteTextToken(TextToken* theToken)
  56. {
  57.     WindowPtr        aWindow;
  58.     DPtr            docPtr;
  59.     TextToken        oldSelection;
  60.     short            oldLength,
  61.                     insertLength;                // Should be zero
  62.     OSErr            err;
  63.     
  64.     if (! theToken->tokenLength)        // Pointless deleting nothing
  65.         return(noErr);
  66.         
  67.     aWindow = theToken->tokenWindow;
  68.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  69.     
  70.     if (! aWindow || ! docPtr)
  71.         return(errAENoSuchObject);
  72.     
  73.     err = GetWindowSelection(aWindow, &oldSelection, &oldLength);
  74.     if (noErr != err) goto done;
  75.  
  76.     err = SelectTextToken(theToken);
  77.     if (noErr != err) goto done;
  78.  
  79.     TEDelete(docPtr->theText);     
  80.             
  81.     docPtr->dirty = true;
  82.     AdjustScrollbars(docPtr, false);
  83.     DrawPageExtras(docPtr);
  84.     
  85.     err = UpdateSelectionToken(theToken, &oldSelection, oldLength, &insertLength);
  86.     
  87. done:
  88.     return(err);
  89. }
  90.  
  91. OSErr    DeleteTextDesc(AEDesc* textDesc)
  92. {
  93.     TextToken        aTextToken;
  94.     Size            actualSize;
  95.     OSErr            err;
  96.  
  97.     if (typeMyText != textDesc->descriptorType)
  98.         return(errAETypeError);
  99.         
  100.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  101.  
  102.     err = DeleteTextToken(&aTextToken);
  103.     
  104.     return(err);
  105. }
  106.  
  107. OSErr    DeleteDesc(AEDesc* aDesc)
  108. {
  109.     AEDesc        deleteDesc = {typeNull, NULL},
  110.                 textDesc = {typeNull, NULL},
  111.                 itemDesc = {typeNull, NULL};
  112.     long        index;
  113.     DescType    theAEKeyword;
  114.     OSErr        err;
  115.     
  116.     if (typeObjectSpecifier == aDesc->descriptorType)
  117.         err = AEResolve(aDesc, kAEIDoMinimum, &deleteDesc);
  118.     else
  119.         err = AEDuplicateDesc(aDesc, &deleteDesc);
  120.         
  121.     if (noErr != err) goto done;
  122.     
  123.     switch (deleteDesc.descriptorType)
  124.     {
  125.         case typeAEList:
  126.             err = AECountItems(&deleteDesc, &index);
  127.             if (noErr != err) goto done;
  128.             
  129.             for (; index > 0; index--)            // Do backwards or offsets will screw up.
  130.             {                                    // Perhaps we should sort this list first.
  131.                                                 // Can a query double up on offsets?
  132.                 err = AEGetNthDesc(&deleteDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  133.                 if (noErr != err) goto done;
  134.                 
  135.                 err = DeleteDesc(&itemDesc);    // Call recursively
  136.                 if (noErr != err) goto done;
  137.  
  138.                 if (itemDesc.dataHandle)
  139.                     AEDisposeDesc(&itemDesc);
  140.             }
  141.             break;
  142.             
  143.         default:
  144.             err = AECoerceDesc(&deleteDesc, typeMyText, &textDesc);
  145.             if (noErr != err) goto done;
  146.             err = DeleteTextDesc(&textDesc);
  147.     }
  148.     
  149. done:
  150.     if (deleteDesc.dataHandle)
  151.         AEDisposeDesc(&deleteDesc);
  152.     if (textDesc.dataHandle)
  153.         AEDisposeDesc(&textDesc);
  154.     if (itemDesc.dataHandle)
  155.         AEDisposeDesc(&itemDesc);
  156.     
  157.     return(err);
  158. }
  159.